/*
 * Copyright (c) 2013-2015, ARM Limited and Contributors. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef _PM_API_SYS_H_
#define _PM_API_SYS_H_

#include <stdint.h>
#include "pm_defs.h"

/**********************************************************
 * System-level API function declarations
 **********************************************************/
enum pm_ret_status pm_req_suspend(enum pm_node_id nid,
                  enum pm_request_ack ack,
                  unsigned int latency,
                  unsigned int state);

enum pm_ret_status pm_self_suspend(enum pm_node_id nid,
                   unsigned int latency,
                   unsigned int state,
                   uintptr_t address);

enum pm_ret_status pm_force_powerdown(enum pm_node_id nid,
                      enum pm_request_ack ack);

enum pm_ret_status pm_abort_suspend(enum pm_abort_reason reason);

enum pm_ret_status pm_req_wakeup(enum pm_node_id nid,
                 unsigned int set_address,
                 uintptr_t address,
                 enum pm_request_ack ack);

enum pm_ret_status pm_set_wakeup_source(enum pm_node_id target,
                    enum pm_node_id wkup_node,
                    unsigned int enable);

enum pm_ret_status pm_system_shutdown(unsigned int type, unsigned int subtype);

enum pm_ret_status pm_init_suspend_cb(enum pm_suspend_reason reason,
                      unsigned int latency,
                      unsigned int state,
                      unsigned int timeout);

/* API functions for managing PM Slaves */
enum pm_ret_status pm_req_node(enum pm_node_id nid,
                   unsigned int capabilities,
                   unsigned int qos,
                   enum pm_request_ack ack);
enum pm_ret_status pm_release_node(enum pm_node_id nid);

enum pm_ret_status pm_set_requirement(enum pm_node_id nid,
                      unsigned int capabilities,
                      unsigned int qos,
                      enum pm_request_ack ack);
enum pm_ret_status pm_set_max_latency(enum pm_node_id nid,
                      unsigned int latency);

/* Miscellaneous API functions */
enum pm_ret_status pm_get_api_version(unsigned int *version);
enum pm_ret_status pm_set_configuration(unsigned int phys_addr);
enum pm_ret_status pm_get_node_status(enum pm_node_id node);
enum pm_ret_status pm_register_notifier(enum pm_node_id nid,
                    unsigned int event,
                    unsigned int wake,
                    unsigned int enable);
enum pm_ret_status pm_get_op_characteristic(enum pm_node_id nid,
                        enum pm_opchar_type type,
                        uint32_t *result);
enum pm_ret_status pm_acknowledge_cb(enum pm_node_id nid,
                     enum pm_ret_status status,
                     unsigned int oppoint);
enum pm_ret_status pm_notify_cb(enum pm_node_id nid,
                unsigned int event,
                unsigned int oppoint);

/* Direct-Control API functions */
enum pm_ret_status pm_reset_assert(unsigned int reset_id,
                   unsigned int assert);
enum pm_ret_status pm_reset_get_status(unsigned int reset_id,
                       unsigned int *reset_status);
enum pm_ret_status pm_mmio_write(uintptr_t address,
                 unsigned int mask,
                 unsigned int value);
enum pm_ret_status pm_mmio_read(uintptr_t address, unsigned int *value);
enum pm_ret_status pm_fpga_load(uint32_t address_high,
                uint32_t address_low,
                uint32_t size,
                uint32_t flags);
enum pm_ret_status pm_fpga_get_status(unsigned int *value);

enum pm_ret_status pm_get_chipid(uint32_t *value);
void pm_get_callbackdata(uint32_t *data, size_t count);

#endif /* _PM_API_SYS_H_ */
